package com.edu.exam.entity.curriculum.course;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Comment;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.time.LocalDateTime;

/**
 * 课程状态历史实体
 * 所属模块：B-01 课程管理模块
 * 对应设计文档：B-01-01-06-数据库设计.md
 *
 * 存储课程状态变更的历史记录，采用简化设计。
 * 不包含业务逻辑代码，仅包含数据字段和JPA注解。
 *
 * @author System
 * @version 1.0.0
 */
@Entity
@Comment("课程状态变更历史表")
@Table(name = "course_status_histories")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CourseStatusHistory {

    /**
     * 历史记录ID，主键
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    /**
     * 课程ID，外键关联课程表
     */
    @NotNull(message = "课程ID不能为空")
    @Column(name = "course_id", nullable = false)
    private Long courseId;

    /**
     * 源状态，枚举值（字符串形式），标识变更前状态
     */
    @NotNull(message = "源状态不能为空")
    @Enumerated(EnumType.STRING)
    @Column(name = "from_status", nullable = false, length = 20)
    private CourseStatus fromStatus;

    /**
     * 目标状态，枚举值（字符串形式），标识变更后状态
     */
    @NotNull(message = "目标状态不能为空")
    @Enumerated(EnumType.STRING)
    @Column(name = "to_status", nullable = false, length = 20)
    private CourseStatus toStatus;

    /**
     * 变更原因，使用大文本字段存储状态变更的详细原因
     */
    @Column(name = "change_reason", columnDefinition = "TEXT")
    private String changeReason;

    /**
     * 变更时间，记录状态变更的时间点
     */
    @NotNull(message = "变更时间不能为空")
    @Column(name = "change_time", nullable = false)
    private LocalDateTime changeTime;
}
